
local unit_list = {}
print('==预加载英雄开始===')
local point = ac.point(2000,2000)
for i,v in ipairs(load_excel('英雄设置.xlsx','英雄数据')) do
    local name = v.name
    v.art = get_unit_slk2(name,'art')
    japi.GetDisabledIcon( v.art )
    v.types = {'英雄'}
    v.state = {
        ['攻击间隔'] = 1.0,
        ['攻击距离'] = 500,
        ['攻击速度'] = 100,
        ['生命上限'] = 0,
        ['生命恢复'] = 0,
        ['魔法上限'] = 100,
        ['魔法恢复'] = 5,
        ['基础攻击'] = 0,
        ['基础力量'] = 200,
        ['基础敏捷'] = 200,
        ['基础智力'] = 200,
        ['每秒金币'] = 20,
        ['每秒木材'] = 2,
        ['暴击几率'] = 5,
    }
    ac.lni('unit',name,v)

    if name~='英雄0' then
        unit_list[#unit_list + 1] = v
    end

    ac.player[16]:create_unit(name,point):remove()
end
print('==预加载英雄结束===')


ac.game:event '玩家-随机英雄'(function(_,player)
    local hero = player.hero
    local lock = player:get_data('不会获取英雄') or {}
    local weight = {}
    local count = 2
    for a,data in ipairs(unit_list) do
        if lock[data.name]==nil and (hero==nil or data.name~=hero.name) then
            table.insert(weight,{data,data['权重']})
        end
    end

    local data = {}
    for a=1,count do
        local temp,index = table.get_by_weight(weight)
        data[a] = temp
        table.remove(weight,index)
    end
    
    player:set_data('选择英雄数据',data)
    player:notify('玩家-选择英雄面板',player,data,function(temp)
        local hero = player.hero
        local name = temp.name
        lock[name] = true
        
        if hero then
            player:notify('玩家-更换英雄',player,name)
            
            if player:get_data('引导-矿场守护者')==nil then
                player:set_data('引导-矿场守护者',true)
                local point = player.kg_point2
                player:set_camera(point,0.5)
                player:notify('引导-显示内容',player,'矿场守护者','守护矿场资源，击杀后会解救一名农民为你挖矿')
            end
        else
            player:notify('玩家-选择英雄',player,name)
        end
    end)
    
end)

ac.sync:event '同步-刷新选择英雄'(function(_,player)
    local hero = player.hero
    if hero:get('英雄刷新次数',0)>0 then
        hero:add('英雄刷新次数',-1)
        player:notify('玩家-随机英雄',player)
        return
    end
    local xd = hero:get_data('付费英雄刷新')
    if player:get('杀敌')>=xd then
        hero:set_data('付费英雄刷新',xd + 500)
        player:add('杀敌',-xd)
        player:notify('玩家-随机英雄',player)
    else
        show_ui_effect(player,1920/2,750,'杀敌')
    end
end)

ac.game:event '玩家-更换英雄'(function(_,player,name)
    local lock = player:get_data('不会获取英雄') or {}
    local hero = player.hero
    lock[name] = true
    player:set_data('不会获取英雄',lock)
    if hero.fh_timer then
        hero.fh_timer:on_timer()
    end
    local data = ac.lni('unit',name)
    local ex = hero.state['攻击距离'] - data.state['攻击距离']
    hero.state['攻击距离'] = data.state['攻击距离']
    hero:transformat(name)
    if not getmetatable(data) then
        setmetatable(data, ac.unit)
        data.__index = data
        data.__tostring = ac.unit.__tostring
    end
    setmetatable(hero, data)
    local abi = hero.tf or name
    hero:add('攻击距离',ex)

    local ski2 = hero:get_data('英雄技能')
    if ski2 and ski2.save_skill~=1 then
        ski2:remove()
    end
    
    local base = ac.lni('unit',name)
    local has = false
    for a=1,7 do
        local temp = hero:find_skill(a,'英雄')
        if temp==nil then
            local temp = hero:add_skill(base['技能'],'英雄',a)
            temp.bind_hero = name
            show_skill_tip(player,temp,'新的')
            has = true
            break
        end
    end

    if has==false then
        player:notify('玩家-显示替换技能',player,base['技能'])
    end
    
    hero.name = name
    hero:set_data('付费英雄刷新',500)
    hero:notify('单位-更换英雄',hero)
    
    hero:set_data('转生次数',hero:get_data('转生次数',0) - 1)
    player:set_data('更换英雄次数',player:get_data('更换英雄次数',0) + 1)
end)


ac.game:event '玩家-选择英雄'(function(_,player,name,point)
    local point = point or player.point1
    local hero = player:create_unit(name,point)
    hero.ui_name = player:get_name()

    hero:set_data('付费英雄刷新',500)
    if hero['技能'] then
        local temp = hero:add_skill(hero['技能'],'英雄')
        temp.bind_hero = name
        hero:set_data('英雄技能',temp)
    end

    hero:event '单位-拦截死亡'(function(trg)
        --player:notify('玩家-复活英雄',player,hero)
        hero:add_buff '假死复活'{time = hero:get '复活时间'}
        return true
    end)
    hero:event '单位-拦截造成伤害'(function(_,data)
        if hero:is_ally(data.target) then
            return true
        end
    end)
    player:add('金币',200)
    player:add('木材',100)
    player:add('杀敌',100)
    unit_add_life(hero)
    --unit_add_life2(hero,2)
    player.hero = hero
    player:set_camera(hero:get_point())
    player:select_unit(hero)
    player:notify('玩家-选择英雄完毕',player,hero)
end)


ac.game:event '玩家-复活英雄'(function(_,player,hero)
    local time = hero:get '复活时间'
    ac.player.self:send_msg(('|cffff0000[系统]|r%s死亡'):format(player:get_color_name()))
    hero.fh_timer = hero:wait(time*1000,function(t)
        local point = hero.fh_point or player.point1
        hero.fh_timer = nil
        t:remove()
        player:set_camera(point)
        hero:revive(point)
        hero:add('魔法',hero:get '魔法上限')
        hero:add_effect('origin',[[Abilities\Spells\Human\Resurrect\ResurrectTarget.mdl]]):remove()
    end)
end)

ac.buff('假死复活'){
    model1 = [[Abilities\Spells\Human\Resurrect\ResurrectTarget.mdl]],
    title = function(self)
        return ('等待复活(|cff00ff00%0.f秒|r)'):format(self:get_remaining())
    end,
    on_add = function(self)
        local hero = self.owner
        hero:notify('英雄-开始复活',hero)
        hero:set_color(0x99000000)
        hero:set('生命',1)
        hero:set('魔法',hero:get('魔法上限'))
        hero:add_restriction '无敌'
        hero:add_restriction '缴械'
        hero:add_restriction '禁魔'
        hero:add_restriction '禁疗'
        hero:add_restriction '幽灵'
        self:gc(function()
            hero:add_effect(self.model1):remove()
            hero:set('生命',hero:get('生命上限'))
            hero:set_color(0xffffffff)
            hero:remove_restriction '无敌'
            hero:remove_restriction '缴械'
            hero:remove_restriction '禁魔'
            hero:remove_restriction '禁疗'
            hero:remove_restriction '幽灵'
        end)
    end
}

--[进阶] 英雄每10级进阶一次
ac.sync:event '同步-点击经验条'(function(_,player)
    local hero = player.hero
    local count = hero and hero:get_data('转生次数',0) or 0
    if count>0 then
        player:notify('玩家-显示选择英雄',player)
        return
    end
    local count = hero and hero:get_data('待转生次数',0) or 0
    if count>0 then
        local unit = player:get_data('挑战进阶')
        if unit and unit:is_alive() then
            return
        end
        local ski2 = hero:get_data('英雄技能')
        if ski2 then
            ski2.save_skill = 1
        end
        local level = player:get_data('转生挑战次数',0) + 1
        local name = ('转生%0.f'):format(level)
        local point = hero:get_point()
        local unit = player:create_enemy('转生挑战',point,name)
        unit:set_model(hero:get_model())
        unit:set_color(0xff000000)
        unit:add_buff '分离演出'{time = 2}
        unit:add_buff '挑战限时'{time = 22}
        player:set_data('挑战进阶',unit)
        unit:event '单位-死亡'(function()
            hero:set_data('待转生次数',hero:get_data('待转生次数',0) - 1)
            hero:set_data('转生次数',hero:get_data('转生次数',0) + 1)
            player:set_data('转生挑战次数',level)
            player:notify('玩家-随机英雄',player)
            player:set_data('挑战进阶',nil)
        end)

        -- local point = hero:get_point()
        -- local unit = player:create_enemy('[挑战]英雄晋升',point)
        -- unit:set_enemy_level(10,'10秒挑战')
        -- unit:add_type('精英')
        -- unit_add_life2(unit)
        -- unit:add_buff '分离演出'{time = 2}
        -- unit:add_buff '挑战限时'{time = 32}
        -- unit:issue_order('attack',hero)
        -- unit:event '单位-死亡'(function()
        --     hero:set_data('转生次数',count - 1)
        --     player:notify('玩家-随机英雄',player)
        -- end)
        -- player:set_data('挑战进阶',unit)
    end
end)


ac.game:event '游戏-注册数据完成'(function()
    ac.each_player(function(player)
        player:notify('玩家-选择英雄',player,'英雄0')
    end)
end)


--注册一个一次性的选择英雄事件
function register_hero(func)
    ac.each_player(function(player)
        player:event '玩家-选择英雄完毕'(function(trg,player,hero)
            trg:remove()
            func(player,hero)
        end)
    end)
end




ac.wait(10,function()
    local test_data = load_excel('英雄设置.xlsx','英雄数据')
    ac.game:notify('测试-注册数据','英雄测试',test_data,function(_,player,name)
        player:notify('玩家-更换英雄',player,name)
    end)
end)